Introduction

Background

This project was done as a part of “Data Analysis” course as part of our teams studies in Digital Sciences for High-Tech in the University of Tel-Aviv. Our team has great interest in using our studies for exploring and in the future maybe even developing tools for improving the way we treat our planet. Therefore our subject is CO2 emissions in congestion with the world happiness index.

Goals

  1. Find the trends of CO2 emissions in different countries along the years 1700-2017.
  2. Find what countries had greater growth in emissions and in which years.
  3. Compare the leading countries with the highest recent trends of growth or decreased emission in correlation with the current and previous UN happiness Index.

Part 1: Importing Data and Packages

Data import

happy_index_2005 <- "Data/world-happiness-report-2005-2020.csv" 
happy_index_2021 <- "Data/world-happiness-report-2021.csv"
emission <- "Data/co2_emission.csv"
population <-"Data/population.csv"

df_2005 <- read.csv(happy_index_2005)
df_2021 <- read.csv(happy_index_2021)
df_emiss <- read.csv(emission, col.names = c("Entity", "Code" , "Year", "co2"))
df_pop <- read.csv(population, col.names = c("Entity", "Code" , "Year", "Population"))

The first Data consists of the UN happiness index for the years 2005-2017.

as_tibble(df_2005)

The second data is the happiness index report for 2021.

as_tibble(df_2021)

The third data contains CO2 emissions from around 1700 up until 2017, by countries and continents.

as_tibble(df_emiss)

The final data is a a list of population sizes by countries for about the same years as the CO2 data.

as_tibble(df_pop)

As seen in the table above, the main dataset regarding emissions has only 4 features, of which 2 are identical (countries and country code). We will now examine the summary of it’s characteristics:

summary(df_emiss)
    Entity              Code                Year           co2            
 Length:20853       Length:20853       Min.   :1751   Min.   :-6.255e+08  
 Class :character   Class :character   1st Qu.:1932   1st Qu.: 3.188e+05  
 Mode  :character   Mode  :character   Median :1971   Median : 3.829e+06  
                                       Mean   :1953   Mean   : 1.931e+08  
                                       3rd Qu.:1995   3rd Qu.: 3.707e+07  
                                       Max.   :2017   Max.   : 3.615e+10  

As seen above, we can see the minimal year, minimal amount of CO2 emissions and same for mean and max values. We also learn about the size of the data, around ~21k rows.

Part 2: Tidying the Data

Tidying Functions

We have just created the two main datasets to work with, which includes important features from all of the previous datasets and some features that we have created above:

  1. “df_all” which include all data per country per year from 1950 til 2017, introducing some new features:
  • Population, taken from the the population’s DF
  • CO2/Population ratio, calculated.
  • “Diff” column, which shows the difference between the previous and the current year emissions for each consecutive year.
  1. “df_merge”, which includes data for each country regarding:
  • The average ratio feature, which is calculated from 1950 to 2017 using the previously explained “ratio” feature.
  • The difference in co2 emission this period and the life-ladder in 2017.
  • The average population in those years.
  • The average CO2 emissions.
  • The 2017’s “Life.Ladder” - happiness index score.
  • “Sum.Dif” - summing over the diff feature.

The summary for df_merge:

summary(df_merge)
    Entity            avg.ratio        avg.Population         avg.co2         
 Length:138         Min.   : 0.03123   Min.   :2.900e+05   Min.   :2.539e+05  
 Class :character   1st Qu.: 0.67361   1st Qu.:4.486e+06   1st Qu.:4.375e+06  
 Mode  :character   Median : 3.04396   Median :9.762e+06   Median :2.017e+07  
                    Mean   : 4.87430   Mean   :4.360e+07   Mean   :1.902e+08  
                    3rd Qu.: 7.70521   3rd Qu.:2.873e+07   3rd Qu.:9.600e+07  
                    Max.   :25.67181   Max.   :1.296e+09   Max.   :5.558e+09  
  Life.Ladder       sum.dif          
 Min.   :2.662   Min.   :-675355128  
 1st Qu.:4.593   1st Qu.:    142380  
 Median :5.587   Median :   6399728  
 Mean   :5.463   Mean   : 102976353  
 3rd Qu.:6.262   3rd Qu.:  28576960  
 Max.   :7.788   Max.   :7786512016  

And for df_all:

summary(df_all)
    Entity              Code                Year           co2            
 Length:17854       Length:17854       Min.   :1950   Min.   :-6.255e+08  
 Class :character   Class :character   1st Qu.:1967   1st Qu.: 4.746e+05  
 Mode  :character   Mode  :character   Median :1984   Median : 4.430e+06  
                                       Mean   :1984   Mean   : 2.423e+08  
                                       3rd Qu.:2002   3rd Qu.: 4.593e+07  
                                       Max.   :2019   Max.   : 3.615e+10  
                                                      NA's   :3595        
      Diff              Population            ratio        
 Min.   :-600971748   Min.   :1.000e+03   Min.   :  0.000  
 1st Qu.:     -9810   1st Qu.:2.400e+05   1st Qu.:  0.408  
 Median :     43968   Median :3.386e+06   Median :  1.841  
 Mean   :   5310082   Mean   :6.108e+07   Mean   :  5.211  
 3rd Qu.:   1018269   3rd Qu.:1.230e+07   3rd Qu.:  6.384  
 Max.   :1543508239   Max.   :7.713e+09   Max.   :403.351  
 NA's   :3595         NA's   :914         NA's   :4509     

skim(df_merge)
-- Data Summary ------------------------
                           Values  
Name                       df_merge
Number of rows             138     
Number of columns          6       
_______________________            
Column type frequency:             
  character                1       
  numeric                  5       
________________________           
Group variables            None    

-- Variable type: character -----------------------------------------------------------
# A tibble: 1 x 8
  skim_variable n_missing complete_rate   min   max empty n_unique whitespace
* <chr>             <int>         <dbl> <int> <int> <int>    <int>      <int>
1 Entity                0             1     4    24     0      138          0

-- Variable type: numeric -------------------------------------------------------------
# A tibble: 5 x 11
  skim_variable  n_missing complete_rate         mean           sd       p0         p25
* <chr>              <int>         <dbl>        <dbl>        <dbl>    <dbl>       <dbl>
1 avg.ratio              0             1         4.87         5.71  3.12e-2       0.674
2 avg.Population         0             1  43601578.   146848485.    2.90e+5 4485573.   
3 avg.co2                0             1 190209421.   689048147.    2.54e+5 4375076.   
4 Life.Ladder            0             1         5.46         1.16  2.66e+0       4.59 
5 sum.dif                0             1 102976353.   694705139.   -6.75e+8  142380.   
          p50         p75          p100 hist 
*       <dbl>       <dbl>         <dbl> <chr>
1        3.04        7.71         25.7  ▇▃▁▁▁
2  9761806.   28733782.   1295924678.   ▇▁▁▁▁
3 20167978.   95996205.   5558492798.   ▇▁▁▁▁
4        5.59        6.26          7.79 ▂▆▇▇▅
5  6399728.   28576960.   7786512016    ▇▁▁▁▁

Part 3: Proccesing of the Data

Visualisation

Countries of the World

In this plot the different countries in the data are shown in deeper colors for higher values of emission to population ratio in the year of 2017

3.1 Countries Emission vs Populatio by Years and continents

The following plot shows for the years 2000-2017 the amount of CO2 emitted from each country vs it’s population. The ratio is shown as well as the size of each dot. For comfort of the view, each country is allocated to it’s fitting continent and a color.



d <- df_all %>%
  filter(Year > 2000) %>%
  filter(Entity != 'World')

d_cont<- data.frame(country = c(d$Entity))

d_cont$continent <- countrycode(sourcevar = d_cont[, 'country'],
                            origin = "country.name",
                            destination = "continent")
Some values were not matched unambiguously: Africa, Americas (other), Antarctic Fisheries, Asia, Asia and Pacific (other), Channel Islands, EU-28, Europe, Europe (other), International transport, Latin America, Micronesia (country), Middle East, North America, Oceania, Saint Barthlemy, Statistical differences, Timor
d$continent <- d_cont$continent

d <- na.omit(d)

fig <- d %>%
  plot_ly(
    x = ~co2, 
    y = ~Population, 
    size = ~ratio,
    frame = ~Year, 
    text = ~Entity, 
    color = ~continent,
    type = 'scatter',
    mode = 'markers'
  )
fig <- fig %>% layout(
      title = "Yearly CO2 Emissions by Countries vs Population",
      xaxis = list(
      type = "log"
    )
  )

fig
`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.`line.width` does not currently support multiple values.

3.2 Commulative Emissions by Countries Over the Years 1950-2017

# d <- df_all[ , c("Entity", "Year", "Population")]
d <- df_all %>%
  filter(Entity != "World") %>%
  filter(co2 != 0)
d
pp <- streamgraph(d, key="Entity",
                  order = "asis",
                  value="co2", 
                  date="Year",
                  offset="zero",
                  sort="co2"
                  ) %>%
  sg_axis_y(tick_format = "e")  %>%
  sg_legend(show=TRUE, label="Country: ") %>%
  sg_title("CO2 Emissions by Years and Countries, 1950-2017")

pp
streamgraph_html returned an object of class `list` instead of a `shiny.tag`.streamgraph_html returned an object of class `list` instead of a `shiny.tag`.
CO2 Emissions by Years and Countries, 1950-2017

3.4 Yearly in CO2 Emissions for Top 10 Polluting Countries

top_emiss_2017 <- df_emiss %>%
  filter(Year == 2017) %>%
  filter(Code != '') %>%
  filter(Entity != "World") %>%
  top_n( 10, co2) %>%
  arrange(desc(co2)) %>%
  head(10)
  
top_countries = top_emiss_2017$Entity
g <- ggplot(data = df_emiss[df_emiss$Entity %in% top_countries, ] 
                          , aes(x = Year, y = co2, group = Entity)) + 
    geom_line() +
    labs(title = "Top 10 Countries by CO2 Emissions") + 
    geom_line(aes(col = Entity)) +
    theme_ipsum()
g <- ggplotly(g)
g
g <- ggplot(data = df_all[df_all$Entity %in% top_countries, ] 
                          , aes(x = Year, y = ratio, group = Entity)) + 
    geom_line(aes(col = Entity)) + 
    labs(title = "Top 10 Countries by CO2 Emissions to population ratio") +
    theme_ipsum()

g <- ggplotly(g)
g
NA

Boxplot for top 10 Countries

# TODO add boxplot for top 10 diff by year
d <- df_all[df_all$Entity %in% top_countries, ] 
d
fig <- plot_ly(d,
               x = ~Entity,
               y = ~Diff,
               type = "box",
               color = ~Year)

fig <- fig %>%  layout(
  title = "Difference in Emission for Top 10 Polluting Countries",
  boxmode = "group")
fig
Ignoring 31 observationsline.color doesn't (yet) support data arraysOnly one fillcolor per trace allowedline.color doesn't (yet) support data arraysOnly one fillcolor per trace allowed'layout' objects don't have these attributes: 'boxmode'
Valid attributes include:
'font', 'title', 'uniformtext', 'autosize', 'width', 'height', 'margin', 'computed', 'paper_bgcolor', 'plot_bgcolor', 'separators', 'hidesources', 'showlegend', 'colorway', 'datarevision', 'uirevision', 'editrevision', 'selectionrevision', 'template', 'modebar', 'newshape', 'activeshape', 'meta', 'transition', '_deprecated', 'clickmode', 'dragmode', 'hovermode', 'hoverdistance', 'spikedistance', 'hoverlabel', 'selectdirection', 'grid', 'calendar', 'xaxis', 'yaxis', 'ternary', 'scene', 'geo', 'mapbox', 'polar', 'radialaxis', 'angularaxis', 'direction', 'orientation', 'editType', 'legend', 'annotations', 'shapes', 'images', 'updatemenus', 'sliders', 'colorscale', 'coloraxis', 'metasrc', 'barmode', 'bargap', 'mapType'
Ignoring 31 observationsline.color doesn't (yet) support data arraysOnly one fillcolor per trace allowedline.color doesn't (yet) support data arraysOnly one fillcolor per trace allowed'layout' objects don't have these attributes: 'boxmode'
Valid attributes include:
'font', 'title', 'uniformtext', 'autosize', 'width', 'height', 'margin', 'computed', 'paper_bgcolor', 'plot_bgcolor', 'separators', 'hidesources', 'showlegend', 'colorway', 'datarevision', 'uirevision', 'editrevision', 'selectionrevision', 'template', 'modebar', 'newshape', 'activeshape', 'meta', 'transition', '_deprecated', 'clickmode', 'dragmode', 'hovermode', 'hoverdistance', 'spikedistance', 'hoverlabel', 'selectdirection', 'grid', 'calendar', 'xaxis', 'yaxis', 'ternary', 'scene', 'geo', 'mapbox', 'polar', 'radialaxis', 'angularaxis', 'direction', 'orientation', 'editType', 'legend', 'annotations', 'shapes', 'images', 'updatemenus', 'sliders', 'colorscale', 'coloraxis', 'metasrc', 'barmode', 'bargap', 'mapType'
NA

Top 10 Happiest countries Emmissions by Years


top_10_happiness <- df_merge %>%
  filter(rank(desc(Life.Ladder))<=10)


g <- ggplot(data = df_emiss[df_emiss$Entity %in% top_10_happiness$Entity, ] 
                          , aes(x = Year, y = co2, group = Entity)) + 
    geom_line() +
    labs(title = "Top 10 happiness Countries by CO2 Emissions") + 
    theme_ipsum() +
    geom_line(aes(col = Entity))
g <- ggplotly(g)
g

Modelling

In this section we are going to suggest two types of correlation based on our exploration of the data:

  1. There is correlation between the total trend of emissions and the current happiness index.
  2. There is correlation between current emission normalized by the population to the current happiness index.
g <- ggplot(data = df_merge, aes(x = avg.ratio, y = Life.Ladder)) + 
    geom_point(aes(colour = Entity)) + 
    labs(title = "Average Ratio vs Happiness Index") +
    theme_ipsum() 
g <- ggplotly(g)
g

In the following plot we have removed china and India because they are sort of “outliers” in a sense that they have displayed much larger grow in emissions compared to other countries, therefore making it very hard to displyon the same plot.

df <- subset(df_merge, Entity != "China" & Entity != "India" )

g <- ggplot(data = df, aes(x = Life.Ladder , y = sum.dif)) + 
    geom_point(aes(colour = Entity)) + 
    labs(title = "Sum of Emissions Difference vs 2017 Happiness Index (China, India ex.)") +
    theme_ipsum()
g <- ggplotly(g)
g

# Part 4: Modeling

We are now going to introduce the linear model:

linearmod  <- lm(Life.Ladder ~ avg.ratio, data=df_merge)

summary(linearmod)

Call:
lm(formula = Life.Ladder ~ avg.ratio, data = df_merge)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.2447 -0.6262 -0.0959  0.6765  2.1682 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.88716    0.10612  46.055  < 2e-16 ***
avg.ratio    0.11818    0.01416   8.346 7.09e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9468 on 136 degrees of freedom
Multiple R-squared:  0.3387,    Adjusted R-squared:  0.3338 
F-statistic: 69.65 on 1 and 136 DF,  p-value: 7.093e-14
confint(linearmod, level=0.95)
                 2.5 %    97.5 %
(Intercept) 4.67731147 5.0970157
avg.ratio   0.09017982 0.1461869
plot(fitted(linearmod),residuals(linearmod))



g <- ggplot(df_merge, aes(x = avg.ratio, y = Life.Ladder)) +
  geom_point(aes(colour = Entity)) + 
  theme_bw() +
  stat_smooth(method = "lm") + 
  labs(title = "Linear Modelling Happiness Index and Average Ratio")
g <- ggplotly(g)
`geom_smooth()` using formula 'y ~ x'
g
NA
NA

numeric_tidy <- df_merge[-1]

corr_data <- cor(numeric_tidy)

g <- ggcorrplot(corr_data, hc.order = TRUE, type = "lower",
   outline.col = "white") +
  labs(title = "Correlation Matrix") +
  theme_ipsum()
   # colors = c("darkolivegreen2", "white", "darkolivegreen"))
g <- ggplotly(g)
g
NA
# TODO The smooth function doesn't work!!!!

gmod  <- lm(Life.Ladder ~ log(avg.ratio), data=df_merge)

summary(gmod)
#plot x vs. y
g <- ggplot( df_merge, aes(x=log(avg.ratio), y=Life.Ladder)) +
    geom_point(aes(colour = Life.Ladder)) +
    theme_ipsum() +
    labs(title = "Another model") +
    geom_smooth(method = "glm",  formula = y~log(x),
    method.args = list(family = "binomial"), 
    se = FALSE)
g <- ggplotly(g)
g

Add text what we need to understand and explain

Conclusions: present

#multiple regression
multi <- lm(Life.Ladder ~ avg.ratio + sum.dif + avg.co2 , data=df_merge)
summary(multi)

Now let’s say we want to compare the differences between the top 10 happiness countries avg.ratio is higher then other countries. In this case, we have two unrelated (i.e., independent or unpaired) groups of samples. Therefore, it’s possible to use an independent t-test to evaluate whether the means are different.

mA - Weighted average of the 10 most happiest countries. mB - Weighted average of the rest of the countries.

Our research questions:

Is the mean of top 10 happiness (mA) is greater than the mean of other countries (mB)? // Yarden - I fixed the sentence

Is the weighted average of the 10 happiest countries (mA) greater than the weighted average of the other countries (mB)?

H0:mA≥mB - The null hypothesis

Ha:mA<mB (less) - The alternative hypothesis

# Create a data frame
T_data <- df_merge %>%
  select(Entity, avg.ratio,) %>%
  mutate(group = ifelse(Entity %in% top_10_happiness$Entity, "Top 10 Contries", "Other Countries")) 
  

## Yarden - Need to add to T_data a column of Life.Ladder

## TODO make a graph that shows the difference of Life Ladder and avg.ratio by groups "top_10" and "others". 

g <- ggboxplot(T_data, x = "group", y = "avg.ratio", 
          color = "group", palette = c("#00AFBB", "#E7B800"),
        ylab = "avg. ratio", xlab = "Group") +
  theme_ipsum() +
  labs(title = "Average Ratio Compared - Top 10 Countries vs Other Countries")

g <- ggplotly(g)
g
NA
NA
#Do the two group have the same variances?
#We’ll use F-test to test for homogeneity in variances. 

res.ftest <- var.test(avg.ratio ~ group, data = T_data)
res.ftest

    F test to compare two variances

data:  avg.ratio by group
F = 3.8362, num df = 127, denom df = 9, p-value = 0.03252
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 1.132105 8.499782
sample estimates:
ratio of variances 
          3.836239 

The p-value of the F-test is p = 0.03252. It is lower than the significance level alpha = 0.05. In conclusion, there is a significant difference between the variances of the two data sets. Therefore, we used the T-test and assumed that the variances are not equal - according to case 1 of hypothesis testing.


# Compute t-test
res <- t.test(avg.ratio ~ group, data = T_data, var.equal = FALSE, alternative = "less")
res

    Welch Two Sample t-test

data:  avg.ratio by group
t = -5.1609, df = 15.107, p-value = 5.678e-05
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
      -Inf -3.574853
sample estimates:
mean in group Other Countries mean in group Top 10 Contries 
                     4.482087                      9.894609 
LS0tDQp0aXRsZTogIkdsb2JhbCBUcmVuZHMgb2YgQ08yIEVtaXNzaW9uIGFuZCBFZmZlY3RzIG9uIHRoZSBHbG9iYWwgSGFwaW5uZXMgSW5kZXgiDQphdXRob3I6ICJHdXkgS3JvdGhhbW1lciwgWWFyZGVuIEthdGFzaCwgR3V5IERhaGFuIg0Kc3VidGl0bGU6IERhdGEgQW5hbHlzaXMgUHJvamVjdCAtIERpZ2l0YWwgU2NpZW5jZXMgZm9yIEhpZ2h0ZWNoDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uOiBubw0KICAgICMgZmlnX3dpZHRoOiAyMA0KICAgICMgZmlnX2hlaWdodDogMTUNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgZm9udHNpemU6IDExcHQNCiAgICB0aGVtZTogdW5pdGVkDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQplZGl0b3Jfb3B0aW9uczoNCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCiMgSW50cm9kdWN0aW9uDQoNCiMjIEJhY2tncm91bmQNCg0KVGhpcyBwcm9qZWN0IHdhcyBkb25lIGFzIGEgcGFydCBvZiAiRGF0YSBBbmFseXNpcyIgY291cnNlIGFzIHBhcnQgb2Ygb3VyIHRlYW1zIA0Kc3R1ZGllcyBpbiBEaWdpdGFsIFNjaWVuY2VzIGZvciBIaWdoLVRlY2ggaW4gdGhlIFVuaXZlcnNpdHkgb2YgVGVsLUF2aXYuIA0KT3VyIHRlYW0gaGFzIGdyZWF0IGludGVyZXN0IGluIHVzaW5nIG91ciBzdHVkaWVzIGZvciBleHBsb3JpbmcgYW5kIGluIHRoZSBmdXR1cmUgbWF5YmUgZXZlbg0KZGV2ZWxvcGluZyB0b29scyBmb3IgaW1wcm92aW5nIHRoZSB3YXkgd2UgdHJlYXQgb3VyIHBsYW5ldC4gVGhlcmVmb3JlIG91ciBzdWJqZWN0IGlzDQpDTzIgZW1pc3Npb25zIGluIGNvbmdlc3Rpb24gd2l0aCB0aGUgd29ybGQgaGFwcGluZXNzIGluZGV4LiANCg0KIyMgR29hbHMNCg0KMS4gRmluZCB0aGUgdHJlbmRzIG9mIENPMiBlbWlzc2lvbnMgaW4gZGlmZmVyZW50IGNvdW50cmllcyBhbG9uZyB0aGUgeWVhcnMgMTcwMC0yMDE3Lg0KMi4gRmluZCB3aGF0IGNvdW50cmllcyBoYWQgZ3JlYXRlciBncm93dGggaW4gZW1pc3Npb25zIGFuZCBpbiB3aGljaCB5ZWFycy4NCjMuIENvbXBhcmUgdGhlIGxlYWRpbmcgY291bnRyaWVzIHdpdGggdGhlIGhpZ2hlc3QgcmVjZW50IHRyZW5kcyBvZiBncm93dGggb3IgZGVjcmVhc2VkIGVtaXNzaW9uDQppbiBjb3JyZWxhdGlvbiB3aXRoIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBVTiBoYXBwaW5lc3MgSW5kZXguIA0KDQojIFBhcnQgMTogSW1wb3J0aW5nIERhdGEgYW5kIFBhY2thZ2VzDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyBpbnN0YWxsIGFuZCBpbXBvcnQgcGFja2FnZXMNCg0KaW5zdGFsbC5wYWNrYWdlcyhjKCJjb3dwbG90IiwgImdnYWx0IiwgImdnYWx0IiwgIkdHYWxseSIsICJIbWlzYyIsDQogICAgICAgICAgICAgICAgICAgIklTTFIiLCAic2tpbXIiLCAiZ2djb3JycGxvdCIsICJnZ3B1YnIiLCAiRGlhZ3JhbW1lUiIsDQogICAgICAgICAgICAgICAgICAgInh0cyIsICJjb3VudHJ5Y29kZSIsICJjb3VudHJ5Y29kZSIsICJzaGlueSIpKQ0KDQpyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigiaHJicm1zdHIvc3RyZWFtZ3JhcGgiKQ0KcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1hcnRpbmN0Yy9yd2EiKSAjIHINCmluc3RhbGwucGFja2FnZXMoIndhZmZsZSIsIHJlcG9zID0gImh0dHBzOi8vY2luYy5ydWQuaXMiKSAjd2FmZmxlIHBsb3QNCmluc3RhbGwucGFja2FnZXMoImdnY2hpY2tsZXQiLCByZXBvcyA9ICJodHRwczovL2NpbmMucnVkLmlzIikgIyBmb3Igcm91bmRlZCBjb3JuZXJzIA0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyBpbXBvcnQgbGlicmFyeQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdnY2hpY2tsZXQpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQpsaWJyYXJ5KGdnYWx0KQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KHJ3YSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KEhtaXNjKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShJU0xSKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkoZ2djb3JycGxvdCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzdHJlYW1ncmFwaCkNCmBgYA0KDQojIyBEYXRhIGltcG9ydA0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpoYXBweV9pbmRleF8yMDA1IDwtICJEYXRhL3dvcmxkLWhhcHBpbmVzcy1yZXBvcnQtMjAwNS0yMDIwLmNzdiIgDQpoYXBweV9pbmRleF8yMDIxIDwtICJEYXRhL3dvcmxkLWhhcHBpbmVzcy1yZXBvcnQtMjAyMS5jc3YiDQplbWlzc2lvbiA8LSAiRGF0YS9jbzJfZW1pc3Npb24uY3N2Ig0KcG9wdWxhdGlvbiA8LSJEYXRhL3BvcHVsYXRpb24uY3N2Ig0KDQpkZl8yMDA1IDwtIHJlYWQuY3N2KGhhcHB5X2luZGV4XzIwMDUpDQpkZl8yMDIxIDwtIHJlYWQuY3N2KGhhcHB5X2luZGV4XzIwMjEpDQpkZl9lbWlzcyA8LSByZWFkLmNzdihlbWlzc2lvbiwgY29sLm5hbWVzID0gYygiRW50aXR5IiwgIkNvZGUiICwgIlllYXIiLCAiY28yIikpDQpkZl9wb3AgPC0gcmVhZC5jc3YocG9wdWxhdGlvbiwgY29sLm5hbWVzID0gYygiRW50aXR5IiwgIkNvZGUiICwgIlllYXIiLCAiUG9wdWxhdGlvbiIpKQ0KYGBgDQoNClRoZSBmaXJzdCBEYXRhIGNvbnNpc3RzIG9mIHRoZSBVTiBoYXBwaW5lc3MgaW5kZXggZm9yIHRoZSB5ZWFycyAyMDA1LTIwMTcuDQoNCmBgYHtyLCBjb2xsYXBzZT1UUlVFfQ0KYXNfdGliYmxlKGRmXzIwMDUpDQpgYGANClRoZSBzZWNvbmQgZGF0YSBpcyB0aGUgaGFwcGluZXNzIGluZGV4IHJlcG9ydCBmb3IgMjAyMS4NCg0KYGBge3IsIGNvbGxhcHNlPVRSVUV9DQphc190aWJibGUoZGZfMjAyMSkNCmBgYA0KVGhlIHRoaXJkIGRhdGEgY29udGFpbnMgQ08yIGVtaXNzaW9ucyBmcm9tIGFyb3VuZCAxNzAwIHVwIHVudGlsIDIwMTcsIGJ5IGNvdW50cmllcyBhbmQgY29udGluZW50cy4NCg0KYGBge3IsIGNvbGxhcHNlPVRSVUV9DQphc190aWJibGUoZGZfZW1pc3MpDQpgYGANClRoZSBmaW5hbCBkYXRhIGlzIGEgYSBsaXN0IG9mIHBvcHVsYXRpb24gc2l6ZXMgYnkgY291bnRyaWVzIGZvciBhYm91dCB0aGUgc2FtZSB5ZWFycyBhcyB0aGUgQ08yIGRhdGEuDQoNCmBgYHtyLCBjb2xsYXBzZT1UUlVFfQ0KYXNfdGliYmxlKGRmX3BvcCkNCmBgYA0KDQpBcyBzZWVuIGluIHRoZSB0YWJsZSBhYm92ZSwgdGhlIG1haW4gZGF0YXNldCByZWdhcmRpbmcgZW1pc3Npb25zIGhhcyBvbmx5IDQgZmVhdHVyZXMsIG9mIHdoaWNoIDIgYXJlIGlkZW50aWNhbCAoY291bnRyaWVzIGFuZCBjb3VudHJ5IGNvZGUpLiBXZSB3aWxsIG5vdyBleGFtaW5lIHRoZSBzdW1tYXJ5IG9mIGl0J3MgY2hhcmFjdGVyaXN0aWNzOg0KDQpgYGB7cn0NCnN1bW1hcnkoZGZfZW1pc3MpDQpgYGANCkFzIHNlZW4gYWJvdmUsIHdlIGNhbiBzZWUgdGhlIG1pbmltYWwgeWVhciwgbWluaW1hbCBhbW91bnQgb2YgQ08yIGVtaXNzaW9ucyBhbmQgc2FtZSBmb3IgbWVhbiBhbmQgbWF4IHZhbHVlcy4gDQpXZSBhbHNvIGxlYXJuIGFib3V0IHRoZSBzaXplIG9mIHRoZSBkYXRhLCBhcm91bmQgfjIxayByb3dzLiANCg0KIyBQYXJ0IDI6IFRpZHlpbmcgdGhlIERhdGENCg0KIyMgVGlkeWluZyBGdW5jdGlvbnMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgYWRkICJkaWYiIGNvbHVtbg0KDQpkZl9lbWlzcyA8LWRmX2VtaXNzICU+JSANCiAgZ3JvdXBfYnkoRW50aXR5KSAlPiUNCiAgbXV0YXRlKERpZmYgPSBjbzIgLSBsYWcoY28yLCBkZWZhdWx0ID0gY28yWzFdKSkNCg0KI2ZpbHRlciB5ZWFyIHVwIDE5NTANCg0KZGZfcG9wX3RvX21lcmdlIDwtIGRmX3BvcCAlPiUNCiAgZmlsdGVyKFllYXIgPiAxOTQ5KQ0KDQpkZl9lbWlzc190b19tZXJnZSA8LSBkZl9lbWlzcyAlPiUNCiAgZmlsdGVyKFllYXIgPiAxOTQ5KQ0KDQojYXJyYW5nZSBkYXRhIHRvIG1lcmdlIGVtaXNzaW9uIGFuZCBwb3B1bGF0aW9uIA0KDQpkZl9lbWlzc190b19tZXJnZSRFbnRpdHkgPC0gYXMuY2hhcmFjdGVyKGRmX2VtaXNzX3RvX21lcmdlJEVudGl0eSkNCmRmX3BvcF90b19tZXJnZSRFbnRpdHkgPC0gYXMuY2hhcmFjdGVyKGRmX3BvcF90b19tZXJnZSRFbnRpdHkpDQoNCmRmX2FsbCA8LSBmdWxsX2pvaW4oZGZfZW1pc3NfdG9fbWVyZ2UsIGRmX3BvcF90b19tZXJnZSwgYnkgPSBjKCdFbnRpdHknLCdZZWFyJykpDQoNCmRyb3BzIDwtIGMoIkNvZGUueSIpDQpkZl9hbGwgPC1kZl9hbGxbLCAhKG5hbWVzKGRmX2FsbCkgJWluJSBkcm9wcyldDQoNCm5hbWVzKGRmX2FsbClbbmFtZXMoZGZfYWxsKSA9PSAiQ29kZS54Il0gPC0gIkNvZGUiDQoNCiNhZGQgY29sdW1uIG9mIG5vcm1hbGl6ZWQgZW1pc3Npb246IGNvMi9wb3B1bGF0aW9uIGJ5IHllYXIgKGF2Zy5yYXRpbykNCg0KZGZfYWxsIDwtIGRmX2FsbCAlPiUNCiAgbXV0YXRlKHJhdGlvID0gY28yL1BvcHVsYXRpb24pDQoNCiMjIyBDcmVhdGUgZGF0YWZyYW1lIGZvciBib3RoIDMwIHllYXJzIGF2ZXJhZ2UgYW5kIGJ5IGNvdW50cmllcw0KDQpuYW1lcyhkZl8yMDA1KQ0KbmFtZXMoZGZfMjAwNSlbbmFtZXMoZGZfMjAwNSkgPT0gIsOvLi5Db3VudHJ5Lm5hbWUiXSA8LSAiRW50aXR5Ig0KDQpkZl8yMDE3IDwtIGRmXzIwMDUgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTcpJT4lDQogIHNlbGVjdChjKExpZmUuTGFkZGVyLCBFbnRpdHkpKQ0KDQpkZl9sYXN0XzMwIDwtIGRmX2FsbCAlPiUNCiAgZmlsdGVyKFllYXIgPj0gMTk4NykgJT4lDQogIG5hLm9taXQoKQ0KDQphZ2cxIDwtIGFnZ3JlZ2F0ZShkZl9sYXN0XzMwWyxjKCdyYXRpbycsICdQb3B1bGF0aW9uJywgJ2NvMicpXSwgbGlzdChkZl9sYXN0XzMwJEVudGl0eSksIG1lYW4pICU+JQ0KICBzZXRfbmFtZXMobm09YygnRW50aXR5JywgJ2F2Zy5yYXRpbycsICdhdmcuUG9wdWxhdGlvbicsICdhdmcuY28yJykpDQoNCmFnZzIgPC0gYWdncmVnYXRlKGRmX2xhc3RfMzBbLGMoJ0RpZmYnKV0sIGxpc3QoZGZfbGFzdF8zMCRFbnRpdHkpLCBzdW0gKSAlPiUNCiAgc2V0X25hbWVzKG5tPWMoJ0VudGl0eScsICdzdW0uZGlmJykpDQphZ2cyDQoNCmRmXzIwMTckRW50aXR5IDwtIGFzLmNoYXJhY3RlcihkZl8yMDE3JEVudGl0eSkNCmFnZzEkRW50aXR5IDwtIGFzLmNoYXJhY3RlcihhZ2cxJEVudGl0eSkNCmFnZzIkRW50aXR5IDwtIGFzLmNoYXJhY3RlcihhZ2cyJEVudGl0eSkNCg0KZGZfbWVyZ2UgPC0gZnVsbF9qb2luKGFnZzEsIGRmXzIwMTcsIGJ5ID0gYygnRW50aXR5JykpICU+JQ0KICBmdWxsX2pvaW4oYWdnMikgJT4lDQogIG5hLm9taXQoKSAjIFRPRE8gY2hlY2sgd2h5IDIwIGNvdW50cmllcyB3ZXJlIHJlbW92ZWQNCg0KZGZfbWVyZ2UNCmBgYA0KDQpXZSBoYXZlIGp1c3QgY3JlYXRlZCB0aGUgdHdvIG1haW4gZGF0YXNldHMgdG8gd29yayB3aXRoLCB3aGljaCBpbmNsdWRlcyBpbXBvcnRhbnQgZmVhdHVyZXMgZnJvbSBhbGwgb2YgdGhlIHByZXZpb3VzIGRhdGFzZXRzIGFuZCBzb21lIGZlYXR1cmVzIHRoYXQgd2UgaGF2ZSBjcmVhdGVkIGFib3ZlOg0KDQoxLiAiZGZfYWxsIiB3aGljaCBpbmNsdWRlIGFsbCBkYXRhIHBlciBjb3VudHJ5IHBlciB5ZWFyIGZyb20gMTk1MCB0aWwgMjAxNywgaW50cm9kdWNpbmcgc29tZSBuZXcgZmVhdHVyZXM6DQogICogUG9wdWxhdGlvbiwgdGFrZW4gZnJvbSB0aGUgdGhlIHBvcHVsYXRpb24ncyBERg0KICAqIENPMi9Qb3B1bGF0aW9uIHJhdGlvLCBjYWxjdWxhdGVkLg0KICAqICJEaWZmIiBjb2x1bW4sIHdoaWNoIHNob3dzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCB0aGUgY3VycmVudCB5ZWFyIGVtaXNzaW9ucyBmb3IgZWFjaCBjb25zZWN1dGl2ZSB5ZWFyLg0KICANCjEuICJkZl9tZXJnZSIsIHdoaWNoIGluY2x1ZGVzIGRhdGEgZm9yIGVhY2ggY291bnRyeSByZWdhcmRpbmc6DQogICogVGhlIGF2ZXJhZ2UgcmF0aW8gZmVhdHVyZSwgd2hpY2ggaXMgY2FsY3VsYXRlZCBmcm9tIDE5NTAgdG8gMjAxNyB1c2luZyB0aGUgcHJldmlvdXNseSBleHBsYWluZWQgInJhdGlvIiBmZWF0dXJlLiANCiAgKiBUaGUgZGlmZmVyZW5jZSBpbiBjbzIgZW1pc3Npb24gdGhpcyBwZXJpb2QgYW5kIHRoZSBsaWZlLWxhZGRlciBpbiAyMDE3Lg0KICAqIFRoZSBhdmVyYWdlIHBvcHVsYXRpb24gaW4gdGhvc2UgeWVhcnMuIA0KICAqIFRoZSBhdmVyYWdlIENPMiBlbWlzc2lvbnMuDQogICogVGhlIDIwMTcncyAiTGlmZS5MYWRkZXIiIC0gaGFwcGluZXNzIGluZGV4IHNjb3JlLiANCiAgKiAiU3VtLkRpZiIgLSBzdW1taW5nIG92ZXIgdGhlIGRpZmYgZmVhdHVyZS4gDQoNClRoZSBzdW1tYXJ5IGZvciBkZl9tZXJnZToNCg0KYGBge3IsIGNvbGxhcHNlPVRSVUV9DQpzdW1tYXJ5KGRmX21lcmdlKQ0KYGBgDQpBbmQgZm9yIGRmX2FsbDoNCmBgYHtyLCBjb2xsYXBzZT1UUlVFfQ0Kc3VtbWFyeShkZl9hbGwpDQpgYGANCg0KYGBge3IsIGNvbGxhcHNlPVRSVUV9DQpza2ltKGRmX21lcmdlKSAjIFRPRE8gTWF5YmVyIHJlbW92ZSB0aGlzID8gc2VlbXMgdG8gbXVjaA0KYGBgDQoNCiMgUGFydCAzOiBQcm9jY2VzaW5nIG9mIHRoZSBEYXRhDQoNCiMjIFZpc3VhbGlzYXRpb24gDQoNCiMjIyBDb3VudHJpZXMgb2YgdGhlIFdvcmxkDQpJbiB0aGlzIHBsb3QgdGhlIGRpZmZlcmVudCBjb3VudHJpZXMgaW4gdGhlIGRhdGEgYXJlIHNob3duIGluIGRlZXBlciBjb2xvcnMgZm9yIGhpZ2hlciB2YWx1ZXMgb2YgZW1pc3Npb24gdG8gcG9wdWxhdGlvbiByYXRpbyBpbiB0aGUgeWVhciBvZiAyMDE3DQpgYGB7cn0NCmQgPSBkZl9hbGwgJT4lDQogIGZpbHRlcihZZWFyPT0yMDE3KQ0KZA0KDQpsIDwtIGxpc3QoY29sb3IgPSB0b1JHQigiZ3JleSIpLCB3aWR0aCA9IDAuMikNCg0KIyBzcGVjaWZ5IG1hcCBwcm9qZWN0aW9uL29wdGlvbnMNCmcgPC0gbGlzdCgNCiAgc2hvd2ZyYW1lID0gRkFMU0UsDQogIHNob3djb2FzdGxpbmVzID0gRkFMU0UsDQogIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnTWVyY2F0b3InKQ0KKQ0KDQpwIDwtIHBsb3RfZ2VvKGQpICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeiA9IH5yYXRpbywgY29sb3IgPSB+cmF0aW8sIGNvbG9ycyA9ICdSZWRzJywNCiAgICB0ZXh0ID0gfkVudGl0eSwgbG9jYXRpb25zID0gfkNvZGUsIG1hcmtlciA9IGxpc3QobGluZSA9IGwpDQogICkgJT4lDQogIGNvbG9yYmFyKHRpdGxlID0gJ0NPMi9Qb3B1bGF0aW9uJywgdGhpY2tuZXNzPTE1KSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gJ1dvcmxkIFJhdGlvIG9mIENPMi9Qb3B1bGF0aW9uJywNCiAgICBnZW8gPSBnDQogICkNCg0KcDwtIGdncGxvdGx5KHApDQpwDQpgYGANCg0KDQojIyMgMy4xIENvdW50cmllcyBFbWlzc2lvbiB2cyBQb3B1bGF0aW8gYnkgWWVhcnMgYW5kIGNvbnRpbmVudHMgDQoNClRoZSBmb2xsb3dpbmcgcGxvdCBzaG93cyBmb3IgdGhlIHllYXJzIDIwMDAtMjAxNyB0aGUgYW1vdW50IG9mIENPMiBlbWl0dGVkIGZyb20gZWFjaCBjb3VudHJ5IHZzIGl0J3MgcG9wdWxhdGlvbi4gVGhlIHJhdGlvIGlzIHNob3duIGFzIHdlbGwgYXMgdGhlIHNpemUgb2YgZWFjaCBkb3QuDQpGb3IgY29tZm9ydCAgb2YgdGhlIHZpZXcsIGVhY2ggY291bnRyeSBpcyBhbGxvY2F0ZWQgdG8gaXQncyBmaXR0aW5nIGNvbnRpbmVudCBhbmQgYSBjb2xvci4gDQoNCmBgYHtyfQ0KDQoNCmQgPC0gZGZfYWxsICU+JQ0KICBmaWx0ZXIoWWVhciA+IDIwMDApICU+JQ0KICBmaWx0ZXIoRW50aXR5ICE9ICdXb3JsZCcpDQoNCmRfY29udDwtIGRhdGEuZnJhbWUoY291bnRyeSA9IGMoZCRFbnRpdHkpKQ0KDQpkX2NvbnQkY29udGluZW50IDwtIGNvdW50cnljb2RlKHNvdXJjZXZhciA9IGRfY29udFssICdjb3VudHJ5J10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luID0gImNvdW50cnkubmFtZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gPSAiY29udGluZW50IikNCmQkY29udGluZW50IDwtIGRfY29udCRjb250aW5lbnQNCg0KZCA8LSBuYS5vbWl0KGQpDQoNCmZpZyA8LSBkICU+JQ0KICBwbG90X2x5KA0KICAgIHggPSB+Y28yLCANCiAgICB5ID0gflBvcHVsYXRpb24sIA0KICAgIHNpemUgPSB+cmF0aW8sDQogICAgZnJhbWUgPSB+WWVhciwgDQogICAgdGV4dCA9IH5FbnRpdHksIA0KICAgIGNvbG9yID0gfmNvbnRpbmVudCwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbWFya2VycycNCiAgKQ0KDQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoDQogICAgICB0aXRsZSA9ICJZZWFybHkgQ08yIEVtaXNzaW9ucyBieSBDb3VudHJpZXMgdnMgUG9wdWxhdGlvbiIsDQogICAgICB4YXhpcyA9IGxpc3QoDQogICAgICB0eXBlID0gImxvZyINCiAgICApDQogICkNCg0KZmlnDQpgYGANCg0KIyMjIDMuMiBDb21tdWxhdGl2ZSBFbWlzc2lvbnMgYnkgQ291bnRyaWVzIE92ZXIgdGhlIFllYXJzIDE5NTAtMjAxNw0KDQpgYGB7cn0NCiMgZCA8LSBkZl9hbGxbICwgYygiRW50aXR5IiwgIlllYXIiLCAiUG9wdWxhdGlvbiIpXQ0KZCA8LSBkZl9hbGwgJT4lDQogIGZpbHRlcihFbnRpdHkgIT0gIldvcmxkIikgJT4lDQogIGZpbHRlcihjbzIgIT0gMCkNCmQNCnBwIDwtIHN0cmVhbWdyYXBoKGQsIGtleT0iRW50aXR5IiwNCiAgICAgICAgICAgICAgICAgIG9yZGVyID0gImFzaXMiLA0KICAgICAgICAgICAgICAgICAgdmFsdWU9ImNvMiIsIA0KICAgICAgICAgICAgICAgICAgZGF0ZT0iWWVhciIsDQogICAgICAgICAgICAgICAgICBvZmZzZXQ9Inplcm8iLA0KICAgICAgICAgICAgICAgICAgc29ydD0iY28yIg0KICAgICAgICAgICAgICAgICAgKSAlPiUNCiAgc2dfYXhpc195KHRpY2tfZm9ybWF0ID0gImUiKSAgJT4lDQogIHNnX2xlZ2VuZChzaG93PVRSVUUsIGxhYmVsPSJDb3VudHJ5OiAiKSAlPiUNCiAgc2dfdGl0bGUoIkNPMiBFbWlzc2lvbnMgYnkgWWVhcnMgYW5kIENvdW50cmllcywgMTk1MC0yMDE3IikNCg0KcHANCg0KDQpgYGANCiMjIyAzLjMgQ29tbXVsYXRpdmUgSGFwcGlubmVzcyBUcmVuZHMgaW4gU2luZ2xlIENvdW50cnkgDQoNCmBgYHtyfQ0KcHAgPC0gc3RyZWFtZ3JhcGgoZGZfMjAwNSwga2V5ID0gIkVudGl0eSIsDQogICAgICAgICAgICAgICAgICAjIG9yZGVyID0gInJldmVyc2UiLA0KICAgICAgICAgICAgICAgICAgdmFsdWU9IkxpZmUuTGFkZGVyIiwgDQogICAgICAgICAgICAgICAgICBkYXRlPSJ5ZWFyIg0KICAgICAgICAgICAgICAgICAgIyBvZmZzZXQ9Inplcm8iLA0KICAgICAgICAgICAgICAgICAgKSAlPiUNCiAgc2dfZmlsbF9icmV3ZXIoIkJsdWVzIikgJT4lDQogIHNnX2xlZ2VuZChzaG93PVRSVUUsIGxhYmVsPSJDb3VudHJ5OiAiKSAlPiUNCiAgc2dfdGl0bGUoIkhhcHBpbmVzcyBJbmRleCBieSBZZWFycyBhbmQgQ291bnRyaWVzLCAxOTUwLTIwMTciKSANCiAgDQoNCnBwDQojIGcgPC0gZ2dwbG90KGRhdGEgPSBkZl8yMDA1LCBhZXMoeCA9IHllYXIsIHkgPSBMaWZlLkxhZGRlciwgZ3JvdXAgPSBFbnRpdHkpKSArIA0KIyAgICAgZ2VvbV9saW5lKCkgKyANCiMgICAgIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIpICsNCiMgICAgIHRoZW1lX2lwc3VtKCkNCiMgICAgIA0KIyBnIDwtIGcgKyBsYWJzKHRpdGxlID0gIkNvbnRyaWVzIEhhcGlubmVzcyBieSBZZWFycyIpDQojIGcgPC0gZ2dwbG90bHkoZykNCiMgZw0KDQpgYGANCg0KIyMjIDMuNCBZZWFybHkgaW4gQ08yIEVtaXNzaW9ucyBmb3IgVG9wIDEwIFBvbGx1dGluZyBDb3VudHJpZXMNCg0KYGBge3J9DQp0b3BfZW1pc3NfMjAxNyA8LSBkZl9lbWlzcyAlPiUNCiAgZmlsdGVyKFllYXIgPT0gMjAxNykgJT4lDQogIGZpbHRlcihDb2RlICE9ICcnKSAlPiUNCiAgZmlsdGVyKEVudGl0eSAhPSAiV29ybGQiKSAlPiUNCiAgdG9wX24oIDEwLCBjbzIpICU+JQ0KICBhcnJhbmdlKGRlc2MoY28yKSkgJT4lDQogIGhlYWQoMTApDQogIA0KdG9wX2NvdW50cmllcyA9IHRvcF9lbWlzc18yMDE3JEVudGl0eQ0KYGBgDQoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoZGF0YSA9IGRmX2VtaXNzW2RmX2VtaXNzJEVudGl0eSAlaW4lIHRvcF9jb3VudHJpZXMsIF0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICwgYWVzKHggPSBZZWFyLCB5ID0gY28yLCBncm91cCA9IEVudGl0eSkpICsgDQogICAgZ2VvbV9saW5lKCkgKw0KICAgIGxhYnModGl0bGUgPSAiVG9wIDEwIENvdW50cmllcyBieSBDTzIgRW1pc3Npb25zIikgKyANCiAgICBnZW9tX2xpbmUoYWVzKGNvbCA9IEVudGl0eSkpICsNCiAgICB0aGVtZV9pcHN1bSgpDQpnIDwtIGdncGxvdGx5KGcpDQpnDQpgYGANCg0KDQpgYGB7cn0NCmcgPC0gZ2dwbG90KGRhdGEgPSBkZl9hbGxbZGZfYWxsJEVudGl0eSAlaW4lIHRvcF9jb3VudHJpZXMsIF0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICwgYWVzKHggPSBZZWFyLCB5ID0gcmF0aW8sIGdyb3VwID0gRW50aXR5KSkgKyANCiAgICBnZW9tX2xpbmUoYWVzKGNvbCA9IEVudGl0eSkpICsgDQogICAgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIGJ5IENPMiBFbWlzc2lvbnMgdG8gUG9wdWxhdGlvbiByYXRpbyIpICsNCiAgICB0aGVtZV9pcHN1bSgpDQoNCmcgPC0gZ2dwbG90bHkoZykNCmcNCg0KYGBgDQojIyMgQm94cGxvdCBmb3IgdG9wIDEwIENvdW50cmllcyANCg0KYGBge3J9DQojIFRPRE8gYWRkIGJveHBsb3QgZm9yIHRvcCAxMCBkaWZmIGJ5IHllYXINCmQgPC0gZGZfYWxsW2RmX2FsbCRFbnRpdHkgJWluJSB0b3BfY291bnRyaWVzLCBdIA0KZA0KZmlnIDwtIHBsb3RfbHkoZCwNCiAgICAgICAgICAgICAgIHggPSB+RW50aXR5LA0KICAgICAgICAgICAgICAgeSA9IH5EaWZmLA0KICAgICAgICAgICAgICAgdHlwZSA9ICJib3giLA0KICAgICAgICAgICAgICAgY29sb3IgPSB+WWVhcikNCg0KZmlnIDwtIGZpZyAlPiUgIGxheW91dCgNCiAgdGl0bGUgPSAiRGlmZmVyZW5jZSBpbiBFbWlzc2lvbiBmb3IgVG9wIDEwIFBvbGx1dGluZyBDb3VudHJpZXMiLA0KICBib3htb2RlID0gImdyb3VwIikNCmZpZw0KICANCmBgYA0KIyMjIFRvcCAxMCBIYXBwaWVzdCBjb3VudHJpZXMgRW1taXNzaW9ucyBieSBZZWFycw0KDQpgYGB7cn0NCg0KdG9wXzEwX2hhcHBpbmVzcyA8LSBkZl9tZXJnZSAlPiUNCiAgZmlsdGVyKHJhbmsoZGVzYyhMaWZlLkxhZGRlcikpPD0xMCkNCg0KDQpnIDwtIGdncGxvdChkYXRhID0gZGZfZW1pc3NbZGZfZW1pc3MkRW50aXR5ICVpbiUgdG9wXzEwX2hhcHBpbmVzcyRFbnRpdHksIF0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICwgYWVzKHggPSBZZWFyLCB5ID0gY28yLCBncm91cCA9IEVudGl0eSkpICsgDQogICAgZ2VvbV9saW5lKCkgKw0KICAgIGxhYnModGl0bGUgPSAiVG9wIDEwIGhhcHBpbmVzcyBDb3VudHJpZXMgYnkgQ08yIEVtaXNzaW9ucyIpICsgDQogICAgdGhlbWVfaXBzdW0oKSArDQogICAgZ2VvbV9saW5lKGFlcyhjb2wgPSBFbnRpdHkpKQ0KZyA8LSBnZ3Bsb3RseShnKQ0KZw0KYGBgDQoNCg0KDQojIyBNb2RlbGxpbmcNCg0KSW4gdGhpcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byBzdWdnZXN0IHR3byB0eXBlcyBvZiBjb3JyZWxhdGlvbiBiYXNlZCBvbiBvdXIgZXhwbG9yYXRpb24gb2YgdGhlIGRhdGE6DQoNCjEuIFRoZXJlIGlzIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHRvdGFsIHRyZW5kIG9mIGVtaXNzaW9ucyBhbmQgdGhlIGN1cnJlbnQgaGFwcGluZXNzIGluZGV4Lg0KMi4gVGhlcmUgaXMgY29ycmVsYXRpb24gYmV0d2VlbiBjdXJyZW50IGVtaXNzaW9uIG5vcm1hbGl6ZWQgYnkgdGhlIHBvcHVsYXRpb24gdG8gdGhlIGN1cnJlbnQgaGFwcGluZXNzIGluZGV4Lg0KDQpgYGB7cn0NCmcgPC0gZ2dwbG90KGRhdGEgPSBkZl9tZXJnZSwgYWVzKHggPSBhdmcucmF0aW8sIHkgPSBMaWZlLkxhZGRlcikpICsgDQogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gRW50aXR5KSkgKyANCiAgICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgUmF0aW8gdnMgSGFwcGluZXNzIEluZGV4IikgKw0KICAgIHRoZW1lX2lwc3VtKCkgDQpnIDwtIGdncGxvdGx5KGcpDQpnDQpgYGANCg0KSW4gdGhlIGZvbGxvd2luZyBwbG90IHdlIGhhdmUgcmVtb3ZlZCBjaGluYSBhbmQgSW5kaWEgYmVjYXVzZSB0aGV5IGFyZSBzb3J0IG9mICJvdXRsaWVycyIgaW4gYSBzZW5zZSB0aGF0IHRoZXkgaGF2ZSBkaXNwbGF5ZWQgbXVjaCBsYXJnZXIgZ3JvdyBpbiBlbWlzc2lvbnMgY29tcGFyZWQgdG8gb3RoZXIgY291bnRyaWVzLCB0aGVyZWZvcmUgbWFraW5nIGl0IHZlcnkgaGFyZCB0byBkaXNwbHlvbiB0aGUgc2FtZSBwbG90LiANCg0KYGBge3J9DQpkZiA8LSBzdWJzZXQoZGZfbWVyZ2UsIEVudGl0eSAhPSAiQ2hpbmEiICYgRW50aXR5ICE9ICJJbmRpYSIgKQ0KDQpnIDwtIGdncGxvdChkYXRhID0gZGYsIGFlcyh4ID0gTGlmZS5MYWRkZXIgLCB5ID0gc3VtLmRpZikpICsgDQogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gRW50aXR5KSkgKyANCiAgICBsYWJzKHRpdGxlID0gIlN1bSBvZiBFbWlzc2lvbnMgRGlmZmVyZW5jZSB2cyAyMDE3IEhhcHBpbmVzcyBJbmRleCAoQ2hpbmEsIEluZGlhIGV4LikiKSArDQogICAgdGhlbWVfaXBzdW0oKQ0KZyA8LSBnZ3Bsb3RseShnKQ0KZw0KYGBgDQoNCiAjIFBhcnQgNDogTW9kZWxpbmcNCiANCiBXZSBhcmUgbm93IGdvaW5nIHRvIGludHJvZHVjZSB0aGUgbGluZWFyIG1vZGVsOg0KYGBge3J9DQpsaW5lYXJtb2QgIDwtIGxtKExpZmUuTGFkZGVyIH4gYXZnLnJhdGlvLCBkYXRhPWRmX21lcmdlKQ0KDQpzdW1tYXJ5KGxpbmVhcm1vZCkNCg0KY29uZmludChsaW5lYXJtb2QsIGxldmVsPTAuOTUpDQpwbG90KGZpdHRlZChsaW5lYXJtb2QpLHJlc2lkdWFscyhsaW5lYXJtb2QpKQ0KDQoNCmcgPC0gZ2dwbG90KGRmX21lcmdlLCBhZXMoeCA9IGF2Zy5yYXRpbywgeSA9IExpZmUuTGFkZGVyKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBFbnRpdHkpKSArIA0KICB0aGVtZV9idygpICsNCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIikgKyANCiAgbGFicyh0aXRsZSA9ICJMaW5lYXIgTW9kZWxsaW5nIEhhcHBpbmVzcyBJbmRleCBhbmQgQXZlcmFnZSBSYXRpbyIpDQpnIDwtIGdncGxvdGx5KGcpDQpnDQoNCg0KYGBgDQoNCmBgYHtyfQ0KDQpudW1lcmljX3RpZHkgPC0gZGZfbWVyZ2VbLTFdDQoNCmNvcnJfZGF0YSA8LSBjb3IobnVtZXJpY190aWR5KQ0KDQpnIDwtIGdnY29ycnBsb3QoY29ycl9kYXRhLCBoYy5vcmRlciA9IFRSVUUsIHR5cGUgPSAibG93ZXIiLA0KICAgb3V0bGluZS5jb2wgPSAid2hpdGUiKSArDQogIGxhYnModGl0bGUgPSAiQ29ycmVsYXRpb24gTWF0cml4IikgKw0KICB0aGVtZV9pcHN1bSgpDQogICAjIGNvbG9ycyA9IGMoImRhcmtvbGl2ZWdyZWVuMiIsICJ3aGl0ZSIsICJkYXJrb2xpdmVncmVlbiIpKQ0KZyA8LSBnZ3Bsb3RseShnKQ0KZw0KDQpgYGANCmBgYHtyfQ0KIyBUT0RPIFRoZSBzbW9vdGggZnVuY3Rpb24gZG9lc24ndCB3b3JrISEhIQ0KDQpnbW9kICA8LSBsbShMaWZlLkxhZGRlciB+IGxvZyhhdmcucmF0aW8pLCBkYXRhPWRmX21lcmdlKQ0KDQpzdW1tYXJ5KGdtb2QpDQojcGxvdCB4IHZzLiB5DQpnIDwtIGdncGxvdCggZGZfbWVyZ2UsIGFlcyh4PWxvZyhhdmcucmF0aW8pLCB5PUxpZmUuTGFkZGVyKSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IExpZmUuTGFkZGVyKSkgKw0KICAgIHRoZW1lX2lwc3VtKCkgKw0KICAgIGxhYnModGl0bGUgPSAiQW5vdGhlciBtb2RlbCIpICsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgIGZvcm11bGEgPSB5fmxvZyh4KSwNCiAgICBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIiksIA0KICAgIHNlID0gRkFMU0UpDQpnIDwtIGdncGxvdGx5KGcpDQpnDQoNCmBgYA0KDQojIEFkZCB0ZXh0IHdoYXQgd2UgbmVlZCB0byB1bmRlcnN0YW5kIGFuZCBleHBsYWluDQojIENvbmNsdXNpb25zOiBwcmVzZW50IA0KDQpgYGB7cn0NCiNtdWx0aXBsZSByZWdyZXNzaW9uDQptdWx0aSA8LSBsbShMaWZlLkxhZGRlciB+IGF2Zy5yYXRpbyArIHN1bS5kaWYgKyBhdmcuY28yICwgZGF0YT1kZl9tZXJnZSkNCnN1bW1hcnkobXVsdGkpDQoNCmBgYA0KTm93IGxldOKAmXMgc2F5IHdlIHdhbnQgdG8gY29tcGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdG9wIDEwIGhhcHBpbmVzcyBjb3VudHJpZXMgYXZnLnJhdGlvIGlzIGhpZ2hlciB0aGVuIG90aGVyIGNvdW50cmllcy4gSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIHR3byB1bnJlbGF0ZWQgKGkuZS4sIGluZGVwZW5kZW50IG9yIHVucGFpcmVkKSBncm91cHMgb2Ygc2FtcGxlcy4gVGhlcmVmb3JlLCBpdOKAmXMgcG9zc2libGUgdG8gdXNlIGFuIGluZGVwZW5kZW50IHQtdGVzdCB0byBldmFsdWF0ZSB3aGV0aGVyIHRoZSBtZWFucyBhcmUgZGlmZmVyZW50LiANCg0KbUEgLSBXZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSAxMCBtb3N0IGhhcHBpZXN0IGNvdW50cmllcy4NCm1CIC0gV2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGUgcmVzdCBvZiB0aGUgY291bnRyaWVzLg0KDQpPdXIgcmVzZWFyY2ggcXVlc3Rpb25zOg0KDQoNCiMjIElzIHRoZSBtZWFuIG9mIHRvcCAxMCBoYXBwaW5lc3MgKG1BKSBpcyBncmVhdGVyIHRoYW4gdGhlIG1lYW4gb2Ygb3RoZXIgY291bnRyaWVzIChtQik/IC8vIFlhcmRlbiAtIEkgZml4ZWQgdGhlIHNlbnRlbmNlDQoNCklzIHRoZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSAxMCBoYXBwaWVzdCBjb3VudHJpZXMgKG1BKSBncmVhdGVyIHRoYW4gdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIGNvdW50cmllcyAobUIpPw0KDQpIMDptQeKJpW1CICAtIFRoZSBudWxsIGh5cG90aGVzaXMNCg0KSGE6bUE8bUIgKGxlc3MpIC0gVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMNCg0KDQpgYGB7cn0NCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZQ0KVF9kYXRhIDwtIGRmX21lcmdlICU+JQ0KICBzZWxlY3QoRW50aXR5LCBhdmcucmF0aW8sKSAlPiUNCiAgbXV0YXRlKGdyb3VwID0gaWZlbHNlKEVudGl0eSAlaW4lIHRvcF8xMF9oYXBwaW5lc3MkRW50aXR5LCAiVG9wIDEwIENvbnRyaWVzIiwgIk90aGVyIENvdW50cmllcyIpKSANCiAgDQoNCiMjIFRPRE8gWWFyZGVuIC0gTmVlZCB0byBhZGQgdG8gVF9kYXRhIGEgY29sdW1uIG9mIExpZmUuTGFkZGVyDQoNCiMjIFRPRE8gbWFrZSBhIGdyYXBoIHRoYXQgc2hvd3MgdGhlIGRpZmZlcmVuY2Ugb2YgTGlmZSBMYWRkZXIgYW5kIGF2Zy5yYXRpbyBieSBncm91cHMgInRvcF8xMCIgYW5kICJvdGhlcnMiLiANCg0KZyA8LSBnZ2JveHBsb3QoVF9kYXRhLCB4ID0gImdyb3VwIiwgeSA9ICJhdmcucmF0aW8iLCANCiAgICAgICAgICBjb2xvciA9ICJncm91cCIsIHBhbGV0dGUgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiKSwNCiAgICAgICAgeWxhYiA9ICJhdmcuIHJhdGlvIiwgeGxhYiA9ICJHcm91cCIpICsNCiAgdGhlbWVfaXBzdW0oKSArDQogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBSYXRpbyBDb21wYXJlZCAtIFRvcCAxMCBDb3VudHJpZXMgdnMgT3RoZXIgQ291bnRyaWVzIikNCg0KZyA8LSBnZ3Bsb3RseShnKQ0KZw0KDQoNCmBgYA0KDQpgYGB7cn0NCiNEbyB0aGUgdHdvIGdyb3VwIGhhdmUgdGhlIHNhbWUgdmFyaWFuY2VzPw0KI1dl4oCZbGwgdXNlIEYtdGVzdCB0byB0ZXN0IGZvciBob21vZ2VuZWl0eSBpbiB2YXJpYW5jZXMuIA0KDQpyZXMuZnRlc3QgPC0gdmFyLnRlc3QoYXZnLnJhdGlvIH4gZ3JvdXAsIGRhdGEgPSBUX2RhdGEpDQpyZXMuZnRlc3QNCg0KYGBgDQpUaGUgcC12YWx1ZSBvZiB0aGUgRi10ZXN0IGlzIHAgPSAwLjAzMjUyLiBJdCBpcyBsb3dlciB0aGFuIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgYWxwaGEgPSAwLjA1LiBJbiBjb25jbHVzaW9uLCB0aGVyZSBpcyAgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhcmlhbmNlcyBvZiB0aGUgdHdvIGRhdGEgc2V0cy4gVGhlcmVmb3JlLCB3ZSB1c2VkIHRoZSBULXRlc3QgYW5kIGFzc3VtZWQgdGhhdCB0aGUgdmFyaWFuY2VzIGFyZSBub3QgZXF1YWwgLSBhY2NvcmRpbmcgdG8gY2FzZSAxIG9mIGh5cG90aGVzaXMgdGVzdGluZy4NCg0KYGBge3J9DQoNCiMgQ29tcHV0ZSB0LXRlc3QNCnJlcyA8LSB0LnRlc3QoYXZnLnJhdGlvIH4gZ3JvdXAsIGRhdGEgPSBUX2RhdGEsIHZhci5lcXVhbCA9IEZBTFNFLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIikNCnJlcw0KDQpgYGA=